package com.cookbook.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.apache.commons.codec.binary.Base64;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Date;

/**
 * @author 毛川
 *
 * 使用说明：使用 @SessionAttributes("user") 注解 controller;
 *  在需要使用权限控制的接口上使用 @ModelAttribute("user") User user;
 *  然后就可以在方法内使用 user 对象了。
 *  RequestAuthority 注解用于判断是否需要权限控制
 */
public class JWTUtils {
    public static final String SECRET = "7786df7fc3a34e26a61c034d5ec8245d";

    public static SecretKey generateKey() {
        byte [] encodedKey = Base64.decodeBase64(SECRET);
        return new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
    }

    public static String getAuthToken(String info, Date expires) {
        SignatureAlgorithm algorithm = SignatureAlgorithm.HS256;
        return Jwts.builder()
                .setIssuer("")
                .setSubject(info)
                .setAudience("user")
                .setExpiration(expires)
                .setIssuedAt(new Date())
                .setId("1")
                .signWith(algorithm, generateKey())
                .compact();
    }

    public static Claims parseToken(String token) {
        try {
            return Jwts.parser()
                    .setSigningKey(generateKey())
                    .parseClaimsJws(token)
                    .getBody();
        } catch (Exception e) {
            return null;
        }
    }

    public static String getUsername(Claims claims) {
        return claims.getSubject();
    }

    public static boolean isExpired(Claims claims) {
        Date date = claims.getExpiration();
        return (date.compareTo(new Date()) <= 0);
    }
}
